- morris
- Medlem ●
- 2006-01-08 00:53
Okej, jag har hittat problemet i alla fall. Jag ska inte kommentera allt för mycket på koden, för jag har inte själv läst boken du följer så jag antar att den bara går igenom språket Objective-C och inte Cocoa då. Till exempel ser jag att du ärver från Object istället för NSObject. Men som sagt, det spelar ingen roll i det här kontextet.
Problemet jag ser ligger i Rectangle -intersect:. Du allokerar en ny Rectangle, resultRect, som en instansvariabel till den Rectangle du intersectar. Sedan accessar du dess instansvariabel origin för att sätta x/y-koordinaterna. Problemet är att det inte finns någon origin i det läget. Instansvariabeln origin skapas bara i -setOrigin:, och den används inte här. En lösning är att flytta instansieringen av origin från -setOrigin: till -init, så att det alltid finns en origin. Här är en diff som illustrerar detta (+ är nya rader och - är borttagna rader om du inte är bekant med formatet):
--- Rektangel.old/Rectangle.m 2006-01-07 23:16:21.000000000 +0100 +++ Rektangel/Rectangle.m 2006-01-08 00:43:36.000000000 +0100 @@ -6,6 +6,15 @@ @implementation Rectangle; //Setters + +- (id)init { + [super init]; + + origin = [[Point alloc] init]; + + return self; +} + -(void)setWidth: (float) w { width = w; @@ -24,8 +33,6 @@ -(void) setOrigin: (Point *) pt { - origin = [[Point alloc] init]; - [origin setX: [pt x] andY: [pt y]]; }
Anledningen att du får så konstiga värden, det vill säga värdena för width och height, är lite invecklade. Normalt i Objective-C garanteras det att om man försöker skicka ett meddelande till nil så får man nil tillbaka. Således:
NSString *string = nil; NSString *newString = [string copy]; unsigned int length = [newString length]
Vi skapar en variabel string som är nil, försöker kopiera den till newString som då blir nil eftersom meddelanden till nil returnerar nil. Vi försöker ta längden på newString som då blir 0. Det sista är lite intressant, för standarden säger bara att vi får objektet nil tillbaka, det säger ingenting om att vi ska få intvärdet 0 tillbaka. Just för intvärden råkar det då fungera, men för flyttalsvärden, som din float, fungerar det däremot inte. Vad du istället får tillbaka är det värde som råkade ligga på stacken just då, de flyttal du använde senast, nämligen height.
Kontentan är i alla fall att du ska passa dig för att ta flyttal från objekt som kan vara nil, för du kan få vad som helst tillbaka.
Till sist kan jag nämna att jag hittade felet genom att starta programmet i debuggern, och kolla alla instansvariabler i resultRect. Då märkte jag att resultRect->origin var nil.