NSString具有共享机制。NSMutableString不具共享机制。
NSMutableString最好预估好长度。如
NSMutableString *mustr3 =[NSMutableString stringWithCapacity:100];
NSArray(元素必须是类对象,具有常量性)初始化方式:
//----------------NSArray初始化-------------
NSArray *array1=[NSArray arrayWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
NSArray *array2=[[NSArray alloc] initWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
NSArray *array3=@[@"Shanghai",@"Beijing",@"New York",@"Paris"];
obj-c的集合类型有三种如下:
NSArray具有常量性不能被改变,存的都是对象的指针,指针不能改变,但是指针所指向的那个对象属性什么的是可以改变的。如果数字什么的想放入,先要转成类如:
//----------------数组元素-------------
NSString *text=@"Panda";//字符串对象
NSInteger number=100;
NSNumber *numberObject1=
[NSNumber numberWithInteger:number ];//使用NSNumber将NSInteger包装为对象
NSNumber *numberObject2=@300u;//使用字面常量初始化
Point point;
point.h=100;
point.v=200;
NSValue *pointObject=
[NSValue value:&point withObjCType:@encode(Point)];//使用NSValue将struct包装为对象
NSNull* nullValue=[NSNull null];
NSArray *array4=@[text, numberObject1,numberObject2,pointObject, nullValue];
NSLog(@"array4: %@" ,array4);
NSMutableArray是NSArray的子类支持改变数组长度和元素指针,初始化后会分配一个缓存容量capacity,当元素数量超过会以近似2倍的速度增长。如:
NSMutableArray *muArray2=[NSMutableArray arrayWithCapacity:10];
BLNPoint *p5=[[BLNPoint alloc] initWithX:50 WithY:100];
//1. 更改元素长度-----不可以!
//[array5 addObject:p5];
//2. 更改元素指针-----不可以!
//array5[0]=p5;
//3. 更改指针指向的内容-----可以!
for(int i=0;i<array5.count;i++){
BLNPoint *pt= array5[i];
pt.x++;
pt.y++;
}
NSLog(@"array5: %@", array5);
//----------------数组的遍历-------------
//快速枚举 最快
for ( BLNPoint* point in array5)
{
point.x++;
point.y++;
}
//迭代器模式 较慢
NSEnumerator *enumerator = [array5 objectEnumerator];
BLNPoint* item;
while (item = [enumerator nextObject])
{
item.x++;
item.y++;
}
//for循环 最慢
for (int i=0; i<array5.count; i++) {
NSLog(@"array5[%d],%@",i,array5[i]);
}
关于协议:
#import <Foundation/Foundation.h>
@protocol Drawable
@property NSInteger x;
@property NSInteger y;
-(void)draw; //默认都是@required,必须实现的
+(void)createShape;
//-(id)init;
//-(void)dealloc;
@optional //(可以选择实现)
-(void)moveToX:(NSInteger)x withY:(NSInteger)y;
@end
一个类可以有多个协议,如:
#import <Foundation/Foundation.h>
@interface Other : NSObject<NSObject,NSCopying,NSCoding,NSFastEnumeration>
@end
if ([obj conformsToProtocol:@protocol(AProtocol) ]) {//使用<span style="font-family: Arial, Helvetica, sans-serif;">conformsToProtocol可以检查是否实现了协议</span>
[obj methodA];
}
关于类别:
现有BLNPoint类,BLNPoint.h:
#import <Foundation/Foundation.h>
@interface BLNPoint : NSObject
{
float _weight;
}
@property NSInteger x;
@property NSInteger y;
-(void)move;
@end
BLNPoint.m
:
#import "BLNPoint.h"
@implementation BLNPoint
-(void)move
{
NSLog(@"Point move ");
}
@end
BLNPoint+Drawing类,BLNPoint+Drawing.h
:
#import <Foundation/Foundation.h>
#import "BLNPoint.h"
@interface BLNPoint(Drawing)
-(void)draw;
//@property NSInteger weight;
-(void)setWeight:(NSInteger)weight;
-(NSInteger)weight;
@end
BLNPoint+Drawing.m
:
#import "BLNPoint+Drawing.h"
@implementation BLNPoint(Drawing)
-(void)draw
{
NSLog(@"Point draw");
}
-(void)setWeight:(NSInteger)weight
{
NSLog(@"Point.setWeight");
_weight=weight;
}
-(NSInteger)weight
{
NSLog(@"Point.weight");
return _weight;
}
-(NSString*) description{
return [NSString stringWithFormat:@"[%ld,%ld]", (long)self.x, (long)self.y];
}
@end
BLNPoint.m多了draw等方法,可以
BLNPoint *point=[[BLNPoint alloc]init];
point.x=100;
point.y=200;
[point move];
[point draw];//多出了<span style="font-family: Menlo; font-size: 11px;">BLNPoint+Drawing里面的方法</span>
扩展:
现有Circle类,Circle.h:
#import <Foundation/Foundation.h>
@interface Circle : NSObject
@property (readonly) NSInteger radius;
-(NSInteger)getArea;
@end
Circle.m:
#import "Circle.h"
//扩展实现
@interface Circle ()
{
NSString * _name;
}
@property (readwrite )NSInteger radius;//修改读写属性
@property NSInteger center;//添加属性
-(float)getDiameter;//实例方法
+(void)process:(Circle*) circle;//类方法
@end
@implementation Circle
+(void)process:(Circle*) circle
{
[circle getDiameter];
[circle getArea];
}
-(NSInteger)getArea{
float area=M_PI*self.radius*self.radius;
NSLog(@"Circle Area : %f",area);
return area;
}
-(float)getDiameter{
float diameter = 2*M_PI*self.radius;
NSLog(@"Diameter : %f", diameter );
return diameter;
}
@end