我的代码越多,我就越迷失...所以我决定为我(以及其他人)创建一个完全专注于内存管理的主题,不要浪费时间理解obj-c基础...我会将其更新为问了新问题!
以下是一些例子:
// myArray is property (retain)
myArray = otherArray;
//myArray isn't a property
myArray = otherArray;
//myArray is a property (retain)
myArray = [[NSArray alloc] init];
//myArray isn't a property
myArray = [[NSArray alloc] init];
Run Code Online (Sandbox Code Playgroud)
---所以,如果我明白了......当你把self.myArray放到Xcode上时,你告诉Xcode使用getter或setter,但是当你做myArray时,你对一切负责,对吧?
[求助] UPDATE1:之间是否有区别:
//myArray is a property
myArray = otherArray; // it is only a reference, releasing otherArray will imply releasing myArray
self.myArray = otherArray; // otherArray is sent a retain message so releasing otherArray will still keep myArray in memory
Run Code Online (Sandbox Code Playgroud)
---是的,有区别(见上面的评论)
[已解决] …
我有一个像这样的plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>highscores</key>
<array>
<dict>
<key>highscoreInSeconds</key>
<string>9</string>
<key>levelName</key>
<string>1</string>
<key>name</key>
<string>Black</string>
</dict>
<dict>
<key>highscoreInSeconds</key>
<string>12</string>
<key>levelName</key>
<string>1</string>
<key>name</key>
<string>Black</string>
</dict>
</array>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
现在我想按此排序highscoreInSeconds.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *plistDirectory = [paths objectAtIndex:0];
NSString* fullPath = [plistDirectory stringByAppendingPathComponent:@"data.plist"];
NSMutableDictionary* pData = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];
NSMutableArray* highscores = [pData valueForKey:@"highscores"];
Run Code Online (Sandbox Code Playgroud)
我现在该如何排序?
非常感谢你!:)
祝你今天愉快.
PS:最后看起来应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist …Run Code Online (Sandbox Code Playgroud) 我有一个NSArray充满了NSDictionary对象,每个NSDictionary里面都有一个唯一的ID.我想根据ID查找特定字典,并在我自己的字典中获取该字典的所有信息.
myArray包含:
[index 0] myDictionary object
name = apple,
weight = 1 pound,
number = 294,
[index 1] myDictionary object
name = pear,
weight = .5 pound,
number = 149,
[index 3] myDictionary object (etc...)
Run Code Online (Sandbox Code Playgroud)
我想得到第二个字典对象的名称和重量(我不知道对象的索引...如果只有两个字母,我可以从中制作一个字典[myArray objectAtIndex:1])
所以,比方说我知道数字149.我怎样才能将myArray中的第二个myDictionary对象变成一个新的NSDictionary?
由于某种原因,所有NSString类型的属性都在我的Article对象中作为NSArrays返回.这是我检索它们的功能:
- (NSArray *)getSavedArticles
{
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
NSError *error = nil;
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *dateSort = [NSSortDescriptor sortDescriptorWithKey:@"last_opened" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:dateSort]];
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
return fetchedObjects;
}Run Code Online (Sandbox Code Playgroud)
我没有为这些创建NSManagedObjectModel,而是我只是使用KVO访问它们.
//self.data has the array returned from getSavedArticles
NSManagedObject *object = [self.data objectAtIndex:indexPath.row];
NSString *path = [object valueForKey:@"path"];
NSString* id = [object valueForKey:@"id"];
Run Code Online (Sandbox Code Playgroud)
当我在变量窗格中查看此内容时path,id我看到(__NSArrayI *) ... Variable is not a CFString. …
我正在阅读的这本书让我写下面的代码:
-(IBAction)displaySomeText:(id)sender {
NSString *cow = @"Milk";
NSString *chicken = @"Egg";
NSString *goat = @"Butter";
NSArray *food = [NSArray arrayWithObjects:cow, chicken, goat, nil];
NSString *string = @"The shopping list is: ";
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]];
[textView insertText:string];
Run Code Online (Sandbox Code Playgroud)
}
我理解数组如何工作,但我需要帮助理解以下代码
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]];
Run Code Online (Sandbox Code Playgroud)
我从来没有见过这样可能的实例.
他让我从NSString课堂上创建一个'字符串'对象,然后我就这样做了
string = [string stringByAppendingString:];
Run Code Online (Sandbox Code Playgroud)
我糊涂了.我从未见过一个示例,我在其中创建一个对象,然后对同一个对象执行一个方法并将其存储在完全相同的对象中.
例如,我知道我可以做到这一点
NSSound *chirp;
chirp = [NSSound soundNamed:@"birdChirp.mp3"];
Run Code Online (Sandbox Code Playgroud)
以上是有道理的,因为我使用了创建的对象并对其执行了类方法.
但我总是认为以下代码的等价物是不可能的
chirp = [chirp methodNameEtc..];
Run Code Online (Sandbox Code Playgroud)
我希望我能很好地解释我的问题.如果不是,我总是可以进一步阐述.
我有一个类型为"餐厅"的阵列,其NSSet为"等级".评级有ID和值.
我想通过ID为01,从高到低的等级对餐厅的数组进行排序.
类似于以下内容,但如何在originalArray上一起使用谓词和排序描述符?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Rating.rating_id=%d", ratingID];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"currentValue" ascending:YES];
NSArray *sorted = [[originalArray allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
Run Code Online (Sandbox Code Playgroud) 所以,基本上我有一个NSArray.
我希望在过滤那些例如NOT以给定前缀开头的NOT之后得到一个包含初始数组内容的数组.
它认为使用filteredArrayUsingPredicate:是最好的方法; 但我不知道我怎么能这样做......
到目前为止这是我的代码(NSArray实际上是一个类别):
- (NSArray*)filteredByPrefix:(NSString *)pref
{
NSMutableArray* newArray = [[NSMutableArray alloc] initWithObjects: nil];
for (NSString* s in self)
{
if ([s hasPrefix:pref]) [newArray addObject:s];
}
return newArray;
}
Run Code Online (Sandbox Code Playgroud)
它是对Cocoa最友好的方法吗?我想要的是尽可能快的东西......
我想将a(或复制?)NSMutableArray转换为a NSString.我想我的问题是我并不真正了解a的结构NSString.转换后我想将它附加到电子邮件正文中.这是我的代码:
- (IBAction)sendEmail
{
NSLog(@"sendEmail");
[textView resignFirstResponder];
[textView1 resignFirstResponder];
if ([MFMailComposeViewController canSendMail])
{
// set the sendTo address
NSMutableArray *recipients = [[NSMutableArray alloc] initWithCapacity:1];
[recipients addObject:@"example@yahoo.com"];
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Iphone Game"];
NSString *string = [string appendString:[NSString stringWithFormat:"%@", [viewArray objectAtIndex:i]]];
[controller setMessageBody:string isHTML:NO];
[controller setToRecipients:recipients];
[self presentModalViewController:controller animated:YES];
[controller release];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
message:@"Your device is not set up for email." delegate:self …Run Code Online (Sandbox Code Playgroud) 我有一个NSMutableArray,它保存了用户高分.我想以数字方式排列项目(数字存储在NSStrings中.)
示例:
4,2,7,8
到
2,4,7,8
如果数据存储在NSStrings中,最简单的方法是什么?
应用程序导航到VC1到VC2,在VC2中"返回","菜单"和"提交"按钮在点击"提交"时显示一条带有消息的警报,单击"确定"按钮时显示"确定"按钮I'我试图弹出到VC1,代码正在执行但导航没有发生.
"返回"和"菜单"按钮也发生了同样的事情,代码正在执行,但没有导航到任何其他页面.使用Xcode 9 beta 6.
我在我的项目中使用的下面一段代码
NSArray *controllersArray = [[self navigationController] viewControllers];
for(UIViewController *controller in controllersArray)
{
if ([controller isKindOfClass:[ViewController1 class]])
{
ViewController1 *accDetailVC = (ViewController1*)controller;
[[self navigationController] popToViewController:accDetailVC animated:YES];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在iOS 11 beta以外的其他iOS版本中工作.如果任何人面临同样的问题,请帮助我.
objective-c uiviewcontroller uinavigationcontroller nsarray ios11
nsarray ×10
objective-c ×7
iphone ×4
ios ×2
nsdictionary ×2
sorting ×2
allocation ×1
cocoa ×1
core-data ×1
equals ×1
instance ×1
ios11 ×1
nspredicate ×1
nsstring ×1
retain ×1